package cn.tedu.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**本类用于实现自定义注解*/
public class TestAnnotation {
}
/**1.2通过@Target注解表示自定义注解@Test可以使用的位置
 * 注意:@Target使用时需要导包
 * 我们通过"ElementType."的方式来指定自定义注解@Test的可用位置
 * 如果有多个值,可以使用"{,}"的格式来写
 * @Target({ElementType.METHOD,ElementType.TYPE})
 * */
@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
/**1.3通过@Retention元注解表示自定义注解@Test的生命周期
 * 注意:@Retention使用时也需要导包
 * 我们通过RetentionPolicy.的方式来指定自定义注解@Test的生命周期
 * 也就是这个注解可以存在到什么周期:源文件中SOURCE/字节码文件中CLASS/运行时RUNTIME
 * 注意:这三个值只能三选一,不能同时选多个*/
@Retention(RetentionPolicy.SOURCE)
/**0.首先注意:自定义注解的语法与Java不同,不要套用Java的格式*/
/**1.注解定义时要使用"@interface 注解名"的格式*/
//1.定义了一个自定义注解,并规定了它可使用的位置和生命周期
@interface Test{//注解名Test是自定义的,可以随意修改
    /**3.自定义注解还可以添加功能--给注解添加属性
     * 注意 int age();不是方法的定义,而是给自定义注解中定义age属性*/
//    int age();
    int age() default 0;
    /**4.我们还可以给自定义注解Test添加特殊属性值value
     * 特殊属性的定义格式与普通属性一致.主要区别在于使用时不同
     *使用此注解给属性赋值的时候,可以不用写成"@Test(value="apple")",
     * 格式简化成"@Test("apple")"直接写值
     * 但是自定义注解类中给特殊属性value赋予默认值时的格式不能简写*/
    String value() default "阿巴";

}
/**2.使用注解时,只要在指定的自定义注解名字前面加上"@"即可使用此注解*/
//2.定义一个类来测试自定义注解
//@Test(age = 10)
class TestAnno{
    /**结论:自定义注解能够加在什么位置,取决与@Target注解的值*/
//    @Test(age = 10)
   String name;
    /**测试3:当我们添加了注解的age属性时,@Test报错
     * 结论:当注解没有定义属性时可以直接使用,如果添加了属性,就必须给属性赋值
     * 测试4:给@Test的age属性赋值以后就不报错了
     * 结论:给属性赋值的格式为"@Test(age = 10)"
     * 注意:不能直接写10,这是错误格式
     * 如果为了使用注解时方便,还可以给属性值指定默认值
     * 这样注解就可以不用赋值直接使用了,格式:int age() default 0;
     * 测试5:给age属性赋予默认值后,可以不加属性,直接使用注解*/
    /**测试6:给特殊属性value赋值时可以简写,相当于(value="apple")*/
    /**测试7:因为已经有默认值了,所以可以直接使用@Test*/
    @Test
   public void eat(){
       System.out.println("下雨天和火锅更配哦~");
   }
}